template<class T>
Matriz<T>::Matriz(aed2::Nat n, aed2::Nat m, T a){
    //constructor
    Arreglo<T> fila(m);
    mat = Arreglo< Arreglo<T> >(n);
    aed2::Nat i;
    for (i = 0; i < m; i++){
        fila.Definir(i, a);
    }
    for (i = 0; i < n; i++){
        mat.Definir(i, fila);
    }
}

template<class T>
Matriz<T>::~Matriz(){
    //destructor
}

template<class T>
void Matriz<T>::definir(aed2::Nat n, aed2::Nat m, T a){
    assert(n < altura() && m < ancho());
    (mat[n])[m] = a;
}

template<class T>
T Matriz<T>::obtener(aed2::Nat n, aed2::Nat m) const{
    assert(n < altura() && m < ancho());
    return (mat[n])[m];
}

template<class T>
Arreglo<T> Matriz<T>::fila(aed2::Nat n) const{
    assert(n < altura());
    return mat[n];
}

template<class T>
Arreglo<T> Matriz<T>::columna(aed2::Nat m) const{
    assert(m < ancho());
    Arreglo<T> res(altura());
    for (aed2::Nat i = 0; i < altura(); i++){
        res.Definir(i, (mat[i])[m]);
    }
    return res;
}

template<class T>
aed2::Nat Matriz<T>::altura() const{
    return mat.Tamanho();
}

template<class T>
aed2::Nat Matriz<T>::ancho() const{
    aed2::Nat res;
    if (altura() == 0)
        res = 0;
    else
        res = mat[0].Tamanho();
    return res;
}
